package usermetadata

import (
	"context"
	"git.mycaigou.com/gfyx/common/authorize"
	"github.com/grpc-ecosystem/go-grpc-middleware/util/metautils"
	jsoniter "github.com/json-iterator/go"
	"google.golang.org/grpc/metadata"
)

const HEADER_USER_INFO = "user_info"

type MetaUserInfo struct {
	// 租户code
	TenantCode string `json:"tenant_code"`
	TenantName string `json:"tenant_name"`
	// 租户用户uid
	TenantUserUid string `json:"tenant_user_uid"`
	// 租户账号如admin
	UserCode string `json:"user_code"`
	// 全局用户id，对应common_user_data表的uid
	CommonUserDataUid string `json:"common_user_data_uid"`
	// 手机号
	MobilePhone string `json:"mobile_phone"`
	// 用户名（中文）
	UserName string `json:"user_name"`
	// 租户用户ID（用户自增ID）
	UserId int64 `json:"user_id"`
}

// 设置用户信息到metadata
func SetUserInfoToMeta(ctx context.Context) (context.Context, error) {
	userInfo := GetUserInfo(ctx)
	if userInfo.CommonUserDataUid == "" {
		return ctx, nil
	}
	byteUserInfo, err := jsoniter.Marshal(userInfo)
	if err != nil {
		return ctx, err
	}
	ctx = metadata.AppendToOutgoingContext(ctx, HEADER_USER_INFO, string(byteUserInfo))
	return ctx, err
}

// 获取ctx里面的用户信息(本服务用户态的)
func GetUserInfo(ctx context.Context) MetaUserInfo {
	return MetaUserInfo{
		TenantCode:        authorize.GetTenantCode(ctx),
		TenantName:        authorize.GetTenantName(ctx),
		TenantUserUid:     authorize.GetTenantUserId(ctx),
		UserCode:          authorize.GetUserCode(ctx),
		CommonUserDataUid: authorize.GetGlobalUserId(ctx),
		UserName:          authorize.GetUserName(ctx),
		MobilePhone:       authorize.GetMobilePhone(ctx),
		UserId:            authorize.GetUserId(ctx),
	}
}

// 获取meta里面的用户信息（上游传递过来的）
func GetMetaUserInfo(ctx context.Context) MetaUserInfo {
	userInfo := metautils.ExtractIncoming(ctx).Get(HEADER_USER_INFO)
	if userInfo == "" {
		// 尝试从 ctx 获取,兼容gin的场景
		if ctxUserInfo, ok := ctx.Value(HEADER_USER_INFO).(MetaUserInfo); ok {
			return ctxUserInfo
		}
	}
	metaUserInfo := MetaUserInfo{}
	_ = jsoniter.Unmarshal([]byte(userInfo), &metaUserInfo)
	return metaUserInfo
}
